+use std::collections::HashSet;
use std::io::File;
use util;
use core::{Package,Manifest,SourceId};
pub fn read_packages(path: &Path, source_id: &SourceId)
-> CargoResult<Vec<Package>>
{
- let manifest = try!(important_paths::find_project_manifest_exact(path, "Cargo.toml"));
- let (pkg, nested) = try!(read_package(&manifest, source_id));
- let mut ret = vec!(pkg);
+ return read_packages(path, source_id, &mut HashSet::new());
- for p in nested.iter() {
- ret.push_all(try!(read_packages(&path.join(p), source_id)).as_slice());
- }
+ fn read_packages(path: &Path, source_id: &SourceId,
+ visited: &mut HashSet<Path>) -> CargoResult<Vec<Package>> {
+ if !visited.insert(path.clone()) { return Ok(Vec::new()) }
+
+ let manifest = try!(important_paths::find_project_manifest_exact(path,
+ "Cargo.toml"));
+ let (pkg, nested) = try!(read_package(&manifest, source_id));
+ let mut ret = vec![pkg];
- Ok(ret)
+ for p in nested.iter() {
+ ret.push_all(try!(read_packages(&path.join(p),
+ source_id,
+ visited)).as_slice());
+ }
+
+ Ok(ret)
+ }
}
execs().with_status(0)
.with_stderr("unused manifest key: lib.build\n"));
})
+
+test!(self_dependency {
+ let mut p = project("foo");
+ p = p
+ .file("Cargo.toml", r#"
+ [package]
+
+ name = "test"
+ version = "0.0.0"
+ authors = []
+
+ [dependencies.test]
+
+ path = "."
+
+ [[lib]]
+
+ name = "test"
+ "#)
+ .file("src/test.rs", "fn main() {}");
+ assert_that(p.cargo_process("cargo-build"),
+ execs().with_status(0));
+})